﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;

namespace SpaceInvaders
{
    public class GerenciadorDeCena
    {
        public static EnumCenas faseAtual;
        public static List<Fase> fase = new List<Fase>();
        Texture2D gameOver;
        Texture2D victory;
        Texture2D intro;
        Texture2D instrucoes;
        Texture2D creditos;
        Icon bVoltar;
        Icon bProsseguir;

        ContentManager content;
        
        public static int intFase = 0;
        public static int Timer = 0;
        public static Jogador player;
        public static bool pause, perdeuVida;
        public int clientBoundsW, clientBoundsH;

        public GerenciadorDeCena(ContentManager content, GraphicsDeviceManager graphics)
        {
            Menu.Load(content);
            clientBoundsH = graphics.PreferredBackBufferHeight;
            clientBoundsW = graphics.PreferredBackBufferWidth;

            faseAtual = EnumCenas.INTRODUCAO;
            fase.Add(new Fase1(content));
            fase.Add(new Fase2(content));
            

            player = new Jogador(content, graphics);
            

            gameOver = content.Load<Texture2D>(@"Imagens\gameOver");
            victory = content.Load<Texture2D>(@"Imagens\victory");
            intro = content.Load<Texture2D>(@"Imagens\Intro");
            instrucoes = content.Load<Texture2D>(@"Imagens\instrucoes");
            creditos = content.Load<Texture2D>(@"Imagens\creditos");
            bVoltar = new Icon(content.Load<Texture2D>(@"Imagens\bot_voltar"), new Vector2(700, 530));
            bProsseguir = new Icon(content.Load<Texture2D>(@"Imagens\bot_voltar"), new Vector2(700, 530));
            this.content = content;


        }
        public void Update(KeyboardState kState, GameTime gameTime, MouseState mState)
        {

            if (kState.IsKeyDown(Keys.Escape))
                if (pause)
                    pause = false;
                else
                    pause = true;

            switch (faseAtual)
            {                    
                case EnumCenas.INTRODUCAO:
                    {
                        if (Timer > 100)
                        {
                            faseAtual = EnumCenas.MENU;
                            Timer = 0;
                        }
                        else
                            Timer++;
                    }
                    break;
                case EnumCenas.MENU:
                    {
                        Menu.Update(mState);
                    }
                    break;
                case EnumCenas.INSTRUCOES:
                    {
                        if (mState.LeftButton == ButtonState.Pressed)
                        {
                            if (bVoltar.CheckMouse(mState))
                            {
                                GerenciadorDeCena.faseAtual = EnumCenas.MENU;
                            }
                        }
                    }
                    break;
                case EnumCenas.CREDITOS:
                    {
                        if (mState.LeftButton == ButtonState.Pressed)
                        {
                            if (bVoltar.CheckMouse(mState))
                            {
                                GerenciadorDeCena.faseAtual = EnumCenas.MENU;
                            }
                        }
                    }
                    break;
                case EnumCenas.RANK:
                    {
                        Ranking.Update(mState);
                    }
                    break;
                case EnumCenas.GANHOU:
                    {
                        if (mState.LeftButton == ButtonState.Pressed)
                        {
                            if (bProsseguir.CheckMouse(mState))
                            {
                                switch (intFase)
                                {
                                    case 1: { faseAtual = EnumCenas.FASE2; fase[1].LoadEnemies(); } break;
                                    case 2: { faseAtual = EnumCenas.PERDEU; } break;
                                }
                            }
                        }

                        GerenciadorDeTiro.playerShots = null;
                        GerenciadorDeTiro.enemyShots = null;
                    }

                    break;
                case EnumCenas.PERDEU:
                    {
                        Timer++;
                        if (Timer > 100)
                        {                            
                            bool writeScore = false;
                            Ranking.LoadScores();
                            for(int n = 0; n < 10; n++)
                            {
                                if (Ranking.NAMES[n] == "------")
                                {
                                    writeScore = true;
                                    break;
                                }
                            }
                            if (writeScore)
                            {
                                //ativando o teclado virtual
                                Ranking.writeScore = true;
                            }
                                                       
                            Timer = 0;
                            intFase = 0;
                            perdeuVida = false;
                            Jogador.lifes = 3;
                            GerenciadorDeTiro.playerShots = null;
                            GerenciadorDeTiro.enemyShots = null; 
                            faseAtual = EnumCenas.RANK;
                        }
                    }
                    break;
                case EnumCenas.FASE1:
                {
                    if (GerenciadorDeInimigo.enemies == null)
                    {
                        faseAtual = EnumCenas.GANHOU;
                        intFase = 1;
                    }
                    if (!pause)
                    {
                        if (!perdeuVida)
                        {
                            player.Update(kState, gameTime);
                            GerenciadorDeInimigo.Update();
                            GerenciadorDeTiro.Update();
                        }
                        else
                        {
                            Jogador.lifes--;

                            if (Jogador.lifes <= 0)
                            {
                                faseAtual = EnumCenas.PERDEU;
                                GerenciadorDeTiro.playerShots = null;
                                GerenciadorDeTiro.enemyShots = null;    
                                GerenciadorDeInimigo.enemies = null;
                                player.position = new Vector2(clientBoundsW / 2, (clientBoundsH - 100));
                                faseAtual = EnumCenas.PERDEU;
                            }
                            else
                            {
                                GerenciadorDeTiro.playerShots = null;
                                GerenciadorDeTiro.enemyShots = null;
                                player.position = new Vector2(clientBoundsW / 2, (clientBoundsH - 100));
                                for (int n = 0; n < GerenciadorDeInimigo.enemies.Length; n++)
                                {
                                    if (GerenciadorDeInimigo.enemies[n].position.Y > 0)
                                        GerenciadorDeInimigo.enemies[n].position.Y--;
                                    else
                                        break;
                                }
                                perdeuVida = false;
                            }
                        }
                        
                    }
                }
                    break;
                case EnumCenas.FASE2:
                    {
                        if (GerenciadorDeInimigo.enemies == null)
                        {
                            intFase = 2;
                            faseAtual = EnumCenas.GANHOU;
                        }
                        if (!pause)
                        {
                            if (!perdeuVida)
                            {
                                player.Update(kState, gameTime);
                                GerenciadorDeInimigo.Update();
                                GerenciadorDeTiro.Update();
                            }
                            else
                            {
                                Jogador.lifes--;

                                if (Jogador.lifes <= 0)
                                {
                                    faseAtual = EnumCenas.PERDEU;
                                    GerenciadorDeTiro.playerShots = null;
                                    GerenciadorDeTiro.enemyShots = null;
                                    GerenciadorDeInimigo.enemies = null;
                                    player.position = new Vector2(clientBoundsW / 2, (clientBoundsH - 100));                                    
                                }
                                else
                                {
                                    GerenciadorDeTiro.playerShots = null;
                                    GerenciadorDeTiro.enemyShots = null;
                                    player.position = new Vector2(clientBoundsW / 2, (clientBoundsH - 100));
                                    for (int n = 0; n < GerenciadorDeInimigo.enemies.Length; n++)
                                    {
                                        if (GerenciadorDeInimigo.enemies[n].position.Y > 0)
                                            GerenciadorDeInimigo.enemies[n].position.Y--;
                                        else
                                            break;
                                    }
                                    perdeuVida = false;
                                }
                            }

                        }
                    }
                    break;
            }
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            switch (faseAtual)
            {
                case EnumCenas.INTRODUCAO:
                    {
                        spriteBatch.Draw(intro, new Vector2(0, 0), Color.White);
                    }
                    break;
                case EnumCenas.MENU:
                    {                        
                        Menu.Draw(spriteBatch);
                        
                    }
                    break;
                case EnumCenas.INSTRUCOES:
                    {
                        spriteBatch.Draw(instrucoes, new Vector2(0, 0), Color.White);
                        spriteBatch.Draw(bVoltar.texture, bVoltar.position, Color.White);
                    }
                    break;
                 case EnumCenas.CREDITOS:
                    {
                        spriteBatch.Draw(creditos, new Vector2(0, 0), Color.White);
                        spriteBatch.Draw(bVoltar.texture, bVoltar.position, Color.White);
                    }
                    break;
                 case EnumCenas.RANK:
                    {
                        Ranking.Draw(spriteBatch);
                    }
                    break;
                case EnumCenas.GANHOU:
                    {
                        spriteBatch.Draw(victory, new Vector2(0, 0), Color.White);

                        spriteBatch.Draw(bProsseguir.texture, bProsseguir.position, null, Color.White, 0f, new Vector2(0, 0), 1f, SpriteEffects.FlipHorizontally, 0f);
                        //spriteBatch.Draw(PROSSEGUIR.Texture, PROSSEGUIR.Position, null, Color.White, MathHelper.ToRadians(180f), new Vector2(0, 0), 1f, SpriteEffects.None, 0f);
                    }
                    break;
                case EnumCenas.PERDEU:
                    {
                        spriteBatch.Draw(gameOver, new Vector2(0, 0), Color.White);
                    }
                    break;
                case EnumCenas.FASE1:
                {
                    fase[0].Draw(spriteBatch);
                    GerenciadorDeTiro.Draw(spriteBatch);
                    player.Draw(spriteBatch);
                    GerenciadorDeInimigo.Draw(spriteBatch);
                    HUD.Draw(spriteBatch);
                }
                break;
                case EnumCenas.FASE2:
                {
                    fase[1].Draw(spriteBatch);
                    GerenciadorDeTiro.Draw(spriteBatch);
                    player.Draw(spriteBatch);
                    GerenciadorDeInimigo.Draw(spriteBatch);
                    HUD.Draw(spriteBatch);
                }
                break;
                case EnumCenas.FASE3:
                {

                }
                break;
            }
        }

    }

    public enum EnumCenas
    {
        INTRODUCAO,
        MENU,
        INSTRUCOES,
        CREDITOS,
        RANK,
        GANHOU,
        PERDEU,
        FASE1,
        FASE2,
        FASE3
    };
}
